package cn.edu.lingnan.part.Utils;

import cn.edu.lingnan.part.annotation.Id;
import cn.edu.lingnan.part.annotation.Table;
import com.baomidou.mybatisplus.generator.config.IFileCreate;
import org.apache.ibatis.jdbc.SQL;
import org.springframework.data.relational.core.sql.In;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: chen_man_cheng
 * @Description: //TODO
 * @Date: Create in 20:01 2020/6/3
 */
public class MySqlProvider {

    public static final String INSERT = "insert";
    public static final String DELETE = "delete";
    public static final String UPDATE = "update";
    /**
     * 这是增加的方法
     * @param obj
     * @return
     */
    public static String insert(Object obj){

        Map<String, String> map = new HashMap<>();
        String table = getTableName(obj);
        System.out.println(table);
        getMap(obj,map);

        return new SQL(){
            {
                INSERT_INTO(table);
                for(String key : map.keySet()){
                    VALUES(key,map.get(key));
                }
            }
        }.toString();
    }

    /**
     * 这是删除的方法
     *
     */
        public static String delete(String table , String where){
            if (StringUtil.isEmpty(table)){
                return null;
            }

            if (StringUtil.isEmpty(where)){
                return null;
            }

            return new SQL(){
                {
                    DELETE_FROM(table);
                    WHERE(where);
                }
            }.toString();
        }


    /**
     * 这是修改的方法
     * @param obj
     * @return
     */
//    public static String update(Object obj) {
//        Map<String, String> map = new HashMap<>();
//        String table = getTableName(obj);
//        String idName = getMap(obj, map);
//        if (StringUtil.isEmpty(idName)) {
//            throw new RuntimeException("实体类->" + obj.getClass().getCanonicalName() + "必须有@Id注解");
//        }
//
//        return new SQL(){
//            {
//                UPDATE(table);
//                for (String key : map.keySet()) {
//                    SET(key, map.get(key));
//                }
//                WHERE(idName + map.get(idName));
//            }
//        }.toString();
//    }

    public static String update(Object obj) {
        Map<String, String> map = new HashMap<>();
        String table = getTableName(obj);
        String idName = getMap(obj, map);
        if (StringUtil.isEmpty(idName)) {
            throw new RuntimeException("实体类->" + obj.getClass().getCanonicalName() + "必须有@Id注解");
        }
        String idValue = map.get(idName);
        map.remove(idName);

        return new SQL(){
            {
                UPDATE(table);
                for (String key : map.keySet()) {
                    SET(key+ "=" + map.get(key));
                }
                WHERE(idName + "=" + idValue);
            }
        }.toString();
    }



    /**
     * 获取表名称
     * @param obj
     */
//    private static String getTableName(Object obj) {
//        Class c = obj.getClass();
//        Table table = (Table)c.getAnnotation(Table.class);
//        if (table != null) {
//            return table.value();
//        }
//
//        return StringUtil.underscoreName(c.getSimpleName());
//    }

    private static String getTableName(Object obj) {
        Class c = obj.getClass();
        Table table = (Table)c.getAnnotation(Table.class);
        if (table != null) {
            return table.value();
        }

        return StringUtil.underscoreName(c.getSimpleName());
    }

    /**
     * 获取表id注解的属性
     * @param obj
     */
//    private static String getIdName(Field obj){
////        获取注解
//        Class c = obj.getClass();
////      拿到类上面id的注解
//        Id id = (Id) c.getAnnotation(Id.class);
//        //id上面是否有值
//        if(id != null && StringUtil.isEmpty(id.value())){
//            return id.value();
//        }
////            return c.getSimpleName();
//        return StringUtil.underscoreName(obj.getName());
//    }

    private static String getIdName(Field obj) {
        Class c = obj.getClass();
        Id id = (Id)c.getAnnotation(Id.class);
        if (id != null && !StringUtil.isEmpty(id.value())) {
            return id.value();
        }

        return StringUtil.underscoreName(obj.getName());
    }

    /**
     * 将对象中非空属性放到map中，并且返回对象中带有@Id注解的属性名或值
     * @param obj
     * @param
     * @return
     */
//    private static String getMap(Object obj, Map<String, String> map){
////        Map<String,String> map = new HashMap<>();
//        Class c = obj.getClass();
//        Field[] fs = c.getDeclaredFields();//获取对象的全部属性
//        String idName = null;
//        for (Field item : fs){
//            String key = item.getName();
//            item.setAccessible(true);//开启属性的权限，否则拿不到值
//
//            if (idName  == null){
//                idName = getIdName(item);
//            }
//            try{
//                if (item.get(obj) != null) {
//                    map.put(StringUtil.underscoreName(key), "#{" + key + "}");
//                }
//            } catch (IllegalAccessException e) {
//                e.printStackTrace();
//            }
//        }
//        return idName;
//    }

    private static String getMap(Object obj, Map<String, String> map) {
        Class c = obj.getClass();
        Field[] fs = c.getDeclaredFields();//获取所有属性
        String idName = null;
        for (Field item : fs) {
            String key = item.getName();
            item.setAccessible(true);
            if (idName == null) {
                idName = getIdName(item);
            }
            try {
                if (item.get(obj) != null) {
                    map.put(StringUtil.underscoreName(key), "#{" + key + "}");
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        return idName;
    }

}
